home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / tex / files / !preview / c / dviread < prev    next >
Encoding:
Text File  |  1991-03-02  |  53.2 KB  |  2,277 lines

  1. /* dviread.c --- Read dvi file; from dvitype.web.  */
  2.  
  3. #include "web2c.h"
  4. #include <stdarg.h>
  5.  
  6. int debug = 0;
  7.  
  8. /* <unix.io.h>: Simulation of Unix open/write etc in terms of <stdio.h> */
  9. /* version 0.01: created AM 18-oct-86. */
  10.  
  11. #ifndef __unix_io_h
  12. #define __unix_io_h
  13. #define __system_io
  14. #define _iob __iob
  15. #define FILEHANDLE int
  16. /* note that the following macro definitions rely on the internal       */
  17. /* details of the NorCroft C <stdio> implementation.                    */
  18.  
  19. /* flags for OPEN */
  20. #define O_RDONLY 0
  21. #define O_WRONLY 1
  22. #define O_RDWRITE 2
  23.  
  24. /* generates small code per module: */
  25. static char _open_mode[][4] = {"rb", "wb", "rb+"};
  26. static FILE *_open_temp;
  27. #define write(fd,buf,siz) fwrite(buf, 1, siz, &_iob[fd])
  28. #define unixread(fd,buf,siz) fread(buf, 1, siz, &_iob[fd])
  29. #define open(name,mode) \
  30.   ((_open_temp = fopen(name,_open_mode[mode]))!=0 ? _open_temp - _iob : -1)
  31. #define creat(name,prot) \
  32.   ((_open_temp = fopen(name,"wb"))!=0 ? _open_temp - _iob : -1)
  33. #define close(fd) fclose(&_iob[fd])
  34. #define lseek(fd,pos,org) fseek(&_iob[fd],pos,org)
  35. extern int _fisatty(FILE *);
  36. #define isatty(fd) _fisatty(&_iob[fd])
  37. #define unlink(file) remove(file)
  38. #define getpid() 1
  39.  
  40. #endif
  41.  
  42. /* end of <unix.io.h> */
  43. /* 9999 30 */ 
  44. #define maxfonts 100 
  45. #define maxwidths 10000 
  46. #define linelength 79 
  47. #define terminallinelength 150 
  48. #define stacksize 100 
  49. #define namesize 1000 
  50. #define namelength 256
  51. typedef schar ASCIIcode  ; 
  52. typedef file_ptr /* of  char */ textfile  ; 
  53. typedef unsigned char eightbits  ; 
  54. typedef file_ptr /* of  eightbits */ bytefile  ; 
  55. ASCIIcode xord[128]  ; 
  56. char xchr[256]  ; 
  57. bytefile dvifile  ; 
  58. bytefile tfmfile  ; 
  59. integer curloc  ; 
  60. char curname[namelength + 1], realnameoffile[namelength + 1]  ; 
  61. eightbits b0, b1, b2, b3  ; 
  62. integer fontnum[maxfonts + 1]  ; 
  63. integer fontname[maxfonts + 1]  ; 
  64. ASCIIcode names[namesize + 1]  ; 
  65. integer fontchecksum[maxfonts + 1]  ; 
  66. integer fontscaledsize[maxfonts + 1]  ; 
  67. integer fontdesignsize[maxfonts + 1]  ; 
  68. integer fontspace[maxfonts + 1]  ; 
  69. integer fontbc[maxfonts + 1]  ; 
  70. integer fontec[maxfonts + 1]  ; 
  71. integer widthbase[maxfonts + 1]  ; 
  72. integer width[maxwidths + 1]  ; 
  73. integer nf  ; 
  74. integer widthptr  ; 
  75. integer inwidth[256]  ; 
  76. integer tfmchecksum  ; 
  77. integer pixelwidth[maxwidths + 1]  ; 
  78. real conv  ; 
  79. real trueconv  ; 
  80. integer numerator, denominator  ; 
  81. integer mag  ; 
  82. schar outmode  ; 
  83. integer maxpages  ; 
  84. real resolution  ; 
  85. integer newmag  ; 
  86. integer startcount[10]  ; 
  87. boolean startthere[10]  ; 
  88. schar startvals  ; 
  89. integer count[10]  ; 
  90. ASCIIcode buffer[terminallinelength + 1]  ; 
  91. integer bufptr  ; 
  92. boolean inpostamble  ; 
  93. integer textptr  ; 
  94. ASCIIcode textbuf[linelength + 1]  ; 
  95. integer h, v, w, x, y, z, hh, vv  ; 
  96. integer hstack[stacksize + 1], vstack[stacksize + 1], wstack[stacksize + 1], 
  97. xstack[stacksize + 1], ystack[stacksize + 1], zstack[stacksize + 1]  ; 
  98. integer hhstack[stacksize + 1], vvstack[stacksize + 1]  ; 
  99. integer maxv  ; 
  100. integer maxh  ; 
  101. integer maxs  ; 
  102. integer maxvsofar, maxhsofar, maxssofar  ; 
  103. integer totalpages  ; 
  104. integer pagecount  ; 
  105. integer s  ; 
  106. integer ss  ; 
  107. integer curfont  ; 
  108. boolean showing  ; 
  109. integer oldbackpointer  ; 
  110. integer newbackpointer  ; 
  111. boolean started  ; 
  112. integer postloc  ; 
  113. integer firstbackpointer  ; 
  114. integer startloc  ; 
  115. integer k, m, n, p, q  ; 
  116.  
  117. char font_name[256];
  118. int font_size;
  119. int font_charwidth;
  120.  
  121. #include "dvitype.h"
  122. /* External procedures for dvitype                              */
  123. /*   Written by: H. Trickey, 2/19/83 (adapted from TeX's ext.c) */
  124.  
  125. #include <string.h>
  126.  
  127. #define TRUE    1
  128. #define FALSE   0
  129.  
  130. integer argc;
  131. char *fontpath;
  132. extern char *getenv();
  133.  
  134. /*
  135.  * setpaths is called to set up the pointer fontpath
  136.  * as follows:  if the user's environment has a value for TEXFONTS
  137.  * then use it;  otherwise, use defaultfontpath.
  138.  */
  139. setpaths()
  140. {
  141.         register char *envpath;
  142.         
  143.         if ((envpath = getenv("TEXFONTS")) != NULL)
  144.             fontpath = envpath;
  145.         else
  146.             fontpath = TEXFONTS;
  147. }
  148.  
  149. #define namelength 256   /* should agree with dvitype.ch */
  150. /* extern char curname[],realnameoffile[];*/ /* these have size namelength */
  151.  
  152. /*
  153.  *      testaccess(amode,filepath)
  154.  *
  155.  *  Test whether or not the file whose name is in the global curname
  156.  *  can be opened for reading (if mode=READACCESS)
  157.  *  or writing (if mode=WRITEACCESS).
  158.  *
  159.  *  The filepath argument is one of the ...FILEPATH constants defined below.
  160.  *  If the filename given in curname does not begin with '/', we try 
  161.  *  prepending all the ':'-separated areanames in the appropriate path to the
  162.  *  filename until access can be made, if it ever can.
  163.  *
  164.  *  The realnameoffile global array will contain the name that yielded an
  165.  *  access success.
  166.  */
  167.  
  168. #define READACCESS 4
  169. #define WRITEACCESS 2
  170.  
  171. #define NOFILEPATH 0
  172. #define FONTFILEPATH 3
  173.  
  174. static packrealnameoffile(char **cpp);
  175.  
  176.  
  177. testaccess(amode,filepath)
  178. int amode,filepath;
  179. {
  180.     register boolean ok;
  181.     register char *p;
  182.     char *curpathplace;
  183.     int f;
  184.     
  185.     switch(filepath) {
  186.         case NOFILEPATH: curpathplace = NULL; break;
  187.         case FONTFILEPATH: curpathplace = fontpath; break;
  188.         }
  189.     if (curname[0]=='/')        /* file name has absolute path */
  190.         curpathplace = NULL;
  191.     do {
  192.         packrealnameoffile(&curpathplace);
  193.         if (amode==READACCESS) {
  194.             FILE *temp;
  195.             /* use system call "access" to see if we could read it */
  196.             ok = FALSE;
  197.             if ((temp = fopen(realnameoffile, "rb")) != NULL) ok = TRUE;
  198.             if (ok) {
  199.               fclose(temp);
  200.             } else {
  201.               tfatal ("(dviread) Cannot open `%s'\n", realnameoffile);
  202.             }
  203.         } else {
  204.             /* WRITEACCESS: use creat to see if we could create it, but close
  205.             the file again if we're OK, to let pc open it for real */
  206.             f = creat(realnameoffile,0666);
  207.             ok = (f >= 0);
  208.             if (ok)
  209.                 (void) close(f);
  210.             }
  211.     } while (!ok && curpathplace != NULL);
  212.     if (ok) {  /* pad realnameoffile with blanks, as Pascal wants */
  213.         for (p = realnameoffile; *p != '\0'; p++)
  214.             /* nothing: find end of string */ ;
  215.         while (p < &(realnameoffile[namelength]))
  216.             *p++ = ' ';
  217.         }
  218.     return (ok);
  219. }
  220.  
  221. /*
  222.  * packrealnameoffile(cpp) makes realnameoffile contain the directory at *cpp,
  223.  * followed by '/', followed by the characters in curname up until the
  224.  * first blank there, and finally a '\0'.  The cpp pointer is left pointing
  225.  * at the next directory in the path.
  226.  * But: if *cpp == NULL, then we are supposed to use curname as is.
  227.  */
  228. static packrealnameoffile(cpp)
  229.     char **cpp;
  230. {
  231.     register char *p,*realname;
  232.     
  233.     realname = realnameoffile;
  234.     if ((p = *cpp)!=NULL) {
  235.         while ((*p != ',') && (*p != '\0')) {
  236.             *realname++ = *p++;
  237.             if (realname == &(realnameoffile[namelength-1]))
  238.                 break;
  239.             }
  240.         if (*p == '\0') *cpp = NULL; /* at end of path now */
  241.         else *cpp = p+1; /* else get past ':' */
  242. #ifndef ARM
  243.         *realname++ = '/';  /* separate the area from the name to follow */
  244. #endif
  245.         }
  246.     /* now append curname to realname... */
  247.     p = curname + 1;
  248.     while (*p != ' ') {
  249.         if (realname >= &(realnameoffile[namelength-1])) {
  250.             tfatal ("(dviread) Full file name is too long\n");
  251.             break;
  252.             }
  253.         *realname++ = *p++;
  254.         }
  255.     *realname = '\0';
  256. }
  257.  
  258. static char **gargv;
  259. argv(n, buf)
  260. int n;
  261. char buf[];
  262. {
  263.     (void) sprintf(buf+1, "%s ", gargv[n]);
  264. }
  265.  
  266.  
  267. dviread_main(ac, av)
  268.      int ac;
  269.      char **av;
  270. {
  271.   argc = ac;
  272.   gargv = av;
  273.   main_body();
  274. }
  275.  
  276.  
  277. #define char_index      strchr
  278.  
  279.  
  280. /* Open a file; don't return if error */
  281. FILE *openf(name, mode)
  282. char *name, *mode;
  283. {
  284.     FILE *result;
  285.     char *cp;
  286.  
  287.     --name;     /* All names are indexed starting at 1 */
  288.     cp = char_index(name, ' ');
  289.     if (cp) *cp = '\0';
  290.     result = fopen(name, mode);
  291.     if (result) return(result);
  292.     perror(name);
  293.     exit(1);
  294.     /*NOTREACHED*/
  295. }
  296.  
  297. /* Print real number r in format n:m */
  298. printreal(r, n, m)
  299. double r;
  300. int n,m;
  301. {
  302.     char fmt[50];
  303.  
  304.     (void) sprintf(fmt, "%%%d.%df", n, m);
  305.     (void) fprintf(stderr, fmt, r);
  306. }
  307.  
  308. /* Return true on end of line or eof of file, else false */
  309. eoln(f)
  310. FILE *f;
  311. {
  312.     register int c;
  313.  
  314.     if (feof(f)) return(1);
  315.     c = getc(f);
  316.     if (c != EOF)
  317.         (void) ungetc(c, f);
  318.     return (c == '\n' || c == EOF);
  319. }
  320.  
  321. /* Return true on end of file, else false */
  322. #undef eof
  323. int eof(f)
  324. FILE *f;
  325. {
  326.     register int c;
  327.  
  328.     if (feof(f)) return(1);
  329.     c = getc(f);
  330.     if (c != EOF)
  331.         (void) ungetc(c, f);
  332.     return (c == EOF);
  333. }
  334.  
  335. integer zround(f)
  336. double f;
  337. {
  338.     if (f >= 0.0) return(f + 0.5);
  339.     return(f - 0.5);
  340. }
  341.  
  342.  
  343. static int oldhh = -1;
  344. static int oldvv = -1;
  345. static int draw_rule = false;
  346.  
  347.  
  348. initialize () {
  349.     integer i  ; 
  350.   setpaths () ; 
  351.   {register integer for_end; i = 0 ; for_end = 31 ; if ( i <= for_end) do 
  352.     xchr [ i ] = '?' ; 
  353.   while ( i++ < for_end ) ; } 
  354.   xchr [ 32 ] = ' ' ; 
  355.   xchr [ 33 ] = '!' ; 
  356.   xchr [ 34 ] = '"' ; 
  357.   xchr [ 35 ] = '#' ; 
  358.   xchr [ 36 ] = '$' ; 
  359.   xchr [ 37 ] = '%' ; 
  360.   xchr [ 38 ] = '&' ; 
  361.   xchr [ 39 ] = '\'' ; 
  362.   xchr [ 40 ] = '(' ; 
  363.   xchr [ 41 ] = ')' ; 
  364.   xchr [ 42 ] = '*' ; 
  365.   xchr [ 43 ] = '+' ; 
  366.   xchr [ 44 ] = ',' ; 
  367.   xchr [ 45 ] = '-' ; 
  368.   xchr [ 46 ] = '.' ; 
  369.   xchr [ 47 ] = '/' ; 
  370.   xchr [ 48 ] = '0' ; 
  371.   xchr [ 49 ] = '1' ; 
  372.   xchr [ 50 ] = '2' ; 
  373.   xchr [ 51 ] = '3' ; 
  374.   xchr [ 52 ] = '4' ; 
  375.   xchr [ 53 ] = '5' ; 
  376.   xchr [ 54 ] = '6' ; 
  377.   xchr [ 55 ] = '7' ; 
  378.   xchr [ 56 ] = '8' ; 
  379.   xchr [ 57 ] = '9' ; 
  380.   xchr [ 58 ] = ':' ; 
  381.   xchr [ 59 ] = ';' ; 
  382.   xchr [ 60 ] = '<' ; 
  383.   xchr [ 61 ] = '=' ; 
  384.   xchr [ 62 ] = '>' ; 
  385.   xchr [ 63 ] = '?' ; 
  386.   xchr [ 64 ] = '@' ; 
  387.   xchr [ 65 ] = 'A' ; 
  388.   xchr [ 66 ] = 'B' ; 
  389.   xchr [ 67 ] = 'C' ; 
  390.   xchr [ 68 ] = 'D' ; 
  391.   xchr [ 69 ] = 'E' ; 
  392.   xchr [ 70 ] = 'F' ; 
  393.   xchr [ 71 ] = 'G' ; 
  394.   xchr [ 72 ] = 'H' ; 
  395.   xchr [ 73 ] = 'I' ; 
  396.   xchr [ 74 ] = 'J' ; 
  397.   xchr [ 75 ] = 'K' ; 
  398.   xchr [ 76 ] = 'L' ; 
  399.   xchr [ 77 ] = 'M' ; 
  400.   xchr [ 78 ] = 'N' ; 
  401.   xchr [ 79 ] = 'O' ; 
  402.   xchr [ 80 ] = 'P' ; 
  403.   xchr [ 81 ] = 'Q' ; 
  404.   xchr [ 82 ] = 'R' ; 
  405.   xchr [ 83 ] = 'S' ; 
  406.   xchr [ 84 ] = 'T' ; 
  407.   xchr [ 85 ] = 'U' ; 
  408.   xchr [ 86 ] = 'V' ; 
  409.   xchr [ 87 ] = 'W' ; 
  410.   xchr [ 88 ] = 'X' ; 
  411.   xchr [ 89 ] = 'Y' ; 
  412.   xchr [ 90 ] = 'Z' ; 
  413.   xchr [ 91 ] = '[' ; 
  414.   xchr [ 92 ] = '\\' ; 
  415.   xchr [ 93 ] = ']' ; 
  416.   xchr [ 94 ] = '^' ; 
  417.   xchr [ 95 ] = '_' ; 
  418.   xchr [ 96 ] = '`' ; 
  419.   xchr [ 97 ] = 'a' ; 
  420.   xchr [ 98 ] = 'b' ; 
  421.   xchr [ 99 ] = 'c' ; 
  422.   xchr [ 100 ] = 'd' ; 
  423.   xchr [ 101 ] = 'e' ; 
  424.   xchr [ 102 ] = 'f' ; 
  425.   xchr [ 103 ] = 'g' ; 
  426.   xchr [ 104 ] = 'h' ; 
  427.   xchr [ 105 ] = 'i' ; 
  428.   xchr [ 106 ] = 'j' ; 
  429.   xchr [ 107 ] = 'k' ; 
  430.   xchr [ 108 ] = 'l' ; 
  431.   xchr [ 109 ] = 'm' ; 
  432.   xchr [ 110 ] = 'n' ; 
  433.   xchr [ 111 ] = 'o' ; 
  434.   xchr [ 112 ] = 'p' ; 
  435.   xchr [ 113 ] = 'q' ; 
  436.   xchr [ 114 ] = 'r' ; 
  437.   xchr [ 115 ] = 's' ; 
  438.   xchr [ 116 ] = 't' ; 
  439.   xchr [ 117 ] = 'u' ; 
  440.   xchr [ 118 ] = 'v' ; 
  441.   xchr [ 119 ] = 'w' ; 
  442.   xchr [ 120 ] = 'x' ; 
  443.   xchr [ 121 ] = 'y' ; 
  444.   xchr [ 122 ] = 'z' ; 
  445.   xchr [ 123 ] = '{' ; 
  446.   xchr [ 124 ] = '|' ; 
  447.   xchr [ 125 ] = '}' ; 
  448.   xchr [ 126 ] = '~' ; 
  449.   {register integer for_end; i = 127 ; for_end = 255 ; if ( i <= for_end) do 
  450.     xchr [ i ] = '?' ; 
  451.   while ( i++ < for_end ) ; } 
  452.   {register integer for_end; i = 0 ; for_end = 127 ; if ( i <= for_end) do 
  453.     xord [ chr ( i ) ] = 32 ; 
  454.   while ( i++ < for_end ) ; } 
  455.   {register integer for_end; i = 32 ; for_end = 126 ; if ( i <= for_end) do 
  456.     xord [ xchr [ i ] ] = i ; 
  457.   while ( i++ < for_end ) ; } 
  458.   nf = 0 ; 
  459.   widthptr = 0 ; 
  460.   fontname [ 0 ] = 0 ; 
  461.   fontspace [ 0 ] = 0 ; 
  462.   outmode = 3 ; 
  463.   maxpages = 1000000L ; 
  464.   startvals = 0 ; 
  465.   startthere [ 0 ] = false ; 
  466.   inpostamble = false ; 
  467.   textptr = 0 ; 
  468.   maxv = 2147483548L ; 
  469.   maxh = 2147483548L ; 
  470.   maxs = stacksize + 1 ; 
  471.   maxvsofar = 0 ; 
  472.   maxhsofar = 0 ; 
  473.   maxssofar = 0 ; 
  474.   pagecount = 0 ; 
  475.   oldbackpointer = -1 ; 
  476.   started = false ; 
  477. opendvifile () {
  478.   if ( argc != 2 ) {
  479.     tfatal ("(dviread) %s\n", "Usage: dvitype <dvi-file>" ) ; 
  480.     uexit ( 1 ) ; 
  481.   } 
  482.   argv ( 1 , curname ) ; 
  483.   if ( testaccess ( 4 , 0 ) ) 
  484.   reset ( dvifile , realnameoffile ) ; 
  485.   else {
  486.           tfatal ("(dviread) %s\n", "DVI file not found" ) ; 
  487.     uexit ( 1 ) ; 
  488.   } 
  489.   curloc = 0 ; 
  490. opentfmfile () {
  491.     if ( testaccess ( 4 , 3 ) ) 
  492.   reset ( tfmfile , realnameoffile ) ; 
  493.   else {
  494.       
  495.     tfatal ("(dviread) TFM file not found (`%s')", realnameoffile) ; 
  496.     uexit ( 1 ) ; 
  497.   } 
  498. readtfmword () {
  499.   read ( tfmfile , b0 ) ; 
  500.   read ( tfmfile , b1 ) ; 
  501.   read ( tfmfile , b2 ) ; 
  502.   read ( tfmfile , b3 ) ; 
  503. integer getbyte () {
  504.     register integer Result; eightbits b  ; 
  505.   if ( eof ( dvifile ) ) {
  506.     tfatal ("(dviread) End of file detected.\n");
  507.     Result = 0 ; 
  508.   } else {
  509.       
  510.     read ( dvifile , b ) ; 
  511.     if (feof(dvifile)) tfatal ("(dviread) Last byte of file has been read.\n");
  512.     curloc = curloc + 1 ; 
  513.     Result = b ; 
  514.   } 
  515.   return(Result) ; 
  516. integer signedbyte () {
  517.     register integer Result; eightbits b  ; 
  518.   read ( dvifile , b ) ; 
  519.   curloc = curloc + 1 ; 
  520.   if ( b < 128 ) 
  521.   Result = b ; 
  522.   else Result = b - 256 ; 
  523.   return(Result) ; 
  524. integer gettwobytes () {
  525.     register integer Result; eightbits a, b  ; 
  526.   read ( dvifile , a ) ; 
  527.   read ( dvifile , b ) ; 
  528.   curloc = curloc + 2 ; 
  529.   Result = a * 256 + b ; 
  530.   return(Result) ; 
  531. integer signedpair () {
  532.     register integer Result; eightbits a, b  ; 
  533.   read ( dvifile , a ) ; 
  534.   read ( dvifile , b ) ; 
  535.   curloc = curloc + 2 ; 
  536.   if ( a < 128 ) 
  537.   Result = a * 256 + b ; 
  538.   else Result = ( a - 256 ) * 256 + b ; 
  539.   return(Result) ; 
  540. integer getthreebytes () {
  541.     register integer Result; eightbits a, b, c  ; 
  542.   read ( dvifile , a ) ; 
  543.   read ( dvifile , b ) ; 
  544.   read ( dvifile , c ) ; 
  545.   curloc = curloc + 3 ; 
  546.   Result = ( a * 256 + b ) * 256 + c ; 
  547.   return(Result) ; 
  548. integer signedtrio () {
  549.     register integer Result; eightbits a, b, c  ; 
  550.   read ( dvifile , a ) ; 
  551.   read ( dvifile , b ) ; 
  552.   read ( dvifile , c ) ; 
  553.   curloc = curloc + 3 ; 
  554.   if ( a < 128 ) 
  555.   Result = ( a * 256 + b ) * 256 + c ; 
  556.   else Result = ( ( a - 256 ) * 256 + b ) * 256 + c ; 
  557.   return(Result) ; 
  558. integer signedquad () {
  559.     register integer Result; eightbits a, b, c, d  ; 
  560.   read ( dvifile , a ) ; 
  561.   read ( dvifile , b ) ; 
  562.   read ( dvifile , c ) ; 
  563.   read ( dvifile , d ) ; 
  564.   curloc = curloc + 4 ; 
  565.   a = a&255; b = b&255; c = c&255; d = d&255;
  566.   Result = (a<<24) | (b<<16) | (c<<8) | d;
  567.   return(Result) ; 
  568. integer dvilength () {
  569.     register integer Result; zfseek ( dvifile , 0 , 2 ) ; 
  570.   Result = ftell ( dvifile ) ; 
  571.   return(Result) ; 
  572. zmovetobyte ( n ) 
  573. integer n ; 
  574. {zfseek ( dvifile , n , 0 ) ; 
  575. zprintfont ( f ) 
  576. integer f ; 
  577. {integer k  ; 
  578. static char fname[256];
  579. char *dest = &fname[0];
  580.   if ( f == nf ) 
  581.   (void) Fputs( stderr ,  "UNDEFINED!" ) ; 
  582.   else {
  583.       
  584.     {register integer for_end; k = fontname [ f ] ; for_end = fontname [ f + 
  585.     1 ] - 1 ; if ( k <= for_end) do 
  586.       (void) putc( (*dest++ = xchr [ names [ k ] ]) ,  stderr );
  587.     while ( k++ < for_end ) ; } 
  588.   } 
  589.   *dest = '\0';
  590.   strcpy(font_name, fname);
  591.  
  592. setfontname ( f ) 
  593. integer f ; 
  594. {integer k  ; 
  595. static char fname[256];
  596. char *dest = &fname[0];
  597.   if ( f == nf ) 
  598.   (void) Fputs( stderr ,  "UNDEFINED!" ) ; 
  599.   else {
  600.       
  601.     {register integer for_end; k = fontname [ f ] ; for_end = fontname [ f + 
  602.     1 ] - 1 ; if ( k <= for_end) do 
  603.       *dest++ = xchr [ names [ k ] ];
  604.     while ( k++ < for_end ) ; } 
  605.   } 
  606.   *dest = '\0';
  607.   strcpy(font_name, fname);
  608.  
  609. boolean zinTFM ( z ) 
  610. integer z ; 
  611. {/* 9997 9998 9999 */ register boolean Result; integer k  ; 
  612.   integer lh  ; 
  613.   integer nw  ; 
  614.   integer wp  ; 
  615.   integer alpha, beta  ; 
  616.   readtfmword () ; 
  617.   lh = b2 * 256 + b3 ; 
  618.   readtfmword () ; 
  619.   fontbc [ nf ] = b0 * 256 + b1 ; 
  620.   fontec [ nf ] = b2 * 256 + b3 ; 
  621.   if ( fontec [ nf ] < fontbc [ nf ] ) 
  622.   fontbc [ nf ] = fontec [ nf ] + 1 ; 
  623.   if ( widthptr + fontec [ nf ] - fontbc [ nf ] + 1 > maxwidths ) 
  624.   {
  625.     tfatal ("(dviread) Internal error: width table overflow");
  626.     goto lab9998 ; 
  627.   } 
  628.   wp = widthptr + fontec [ nf ] - fontbc [ nf ] + 1 ; 
  629.   readtfmword () ; 
  630.   nw = b0 * 256 + b1 ; 
  631.   if ( ( nw == 0 ) || ( nw > 256 ) ) 
  632.   goto lab9997 ; 
  633.   {register integer for_end; k = 1 ; for_end = 3 + lh ; if ( k <= for_end) do 
  634.     {
  635.       if ( eof ( tfmfile ) ) 
  636.       goto lab9997 ; 
  637.       readtfmword () ; 
  638.       if ( k == 4 ) 
  639.       if ( b0 < 128 ) 
  640.       tfmchecksum = ( ( b0 * 256 + b1 ) * 256 + b2 ) * 256 + b3 ; 
  641.       else tfmchecksum = ( ( ( b0 - 256 ) * 256 + b1 ) * 256 + b2 ) * 256 + b3 
  642.       ; 
  643.     } 
  644.   while ( k++ < for_end ) ; } 
  645.   if ( wp > 0 ) 
  646.   {register integer for_end; k = widthptr ; for_end = wp - 1 ; if ( k <= 
  647.   for_end) do 
  648.     {
  649.       readtfmword () ; 
  650.       if ( b0 > nw ) 
  651.       goto lab9997 ; 
  652.       width [ k ] = b0 ; 
  653.     } 
  654.   while ( k++ < for_end ) ; } 
  655.   {
  656.     alpha = 16 * z ; 
  657.     beta = 16 ; 
  658.     while ( z >= 8388608L ) {
  659.         
  660.       z = z / 2 ; 
  661.       beta = beta / 2 ; 
  662.     } 
  663.   } 
  664.   {register integer for_end; k = 0 ; for_end = nw - 1 ; if ( k <= for_end) do 
  665.     {
  666.       readtfmword () ; 
  667.       inwidth [ k ] = ( ( ( ( ( b3 * z ) / 256 ) + ( b2 * z ) ) / 256 ) + ( b1 
  668.       * z ) ) / beta ; 
  669.       if ( b0 > 0 ) 
  670.       if ( b0 < 255 ) 
  671.       goto lab9997 ; 
  672.       else inwidth [ k ] = inwidth [ k ] - alpha ; 
  673.     } 
  674.   while ( k++ < for_end ) ; } 
  675.   if ( inwidth [ 0 ] != 0 ) 
  676.   goto lab9997 ; 
  677.   widthbase [ nf ] = widthptr - fontbc [ nf ] ; 
  678.   if ( wp > 0 ) 
  679.   {register integer for_end; k = widthptr ; for_end = wp - 1 ; if ( k <= 
  680.   for_end) do 
  681.     if ( width [ k ] == 0 ) 
  682.     {
  683.       width [ k ] = 2147483647L ; 
  684.       pixelwidth [ k ] = 0 ; 
  685.     } 
  686.     else {
  687.         
  688.       width [ k ] = inwidth [ width [ k ] ] ; 
  689.       pixelwidth [ k ] = round ( conv * ( width [ k ] ) ) ; 
  690.     } 
  691.   while ( k++ < for_end ) ; } 
  692.   widthptr = wp ; 
  693.   Result = true ; 
  694.   goto lab9999 ; 
  695.   lab9997: tfatal ("(dviread) TFM file is bad" ) ; 
  696.   lab9998: Result = false ; 
  697.   lab9999: ; 
  698.   fclose ( tfmfile ); /* gt */
  699.   return(Result) ; 
  700. boolean startmatch () {
  701.     register boolean Result; schar k  ; 
  702.   boolean match  ; 
  703.   match = true ; 
  704.   {register integer for_end; k = 0 ; for_end = startvals ; if ( k <= for_end) 
  705.   do 
  706.     if ( startthere [ k ] && ( startcount [ k ] != count [ k ] ) ) 
  707.     match = false ; 
  708.   while ( k++ < for_end ) ; } 
  709.   Result = match ; 
  710.   return(Result) ; 
  711. inputln () {
  712.     integer k  ; 
  713.   flush ( stderr ) ; 
  714.   if ( eoln ( stdin ) ) 
  715.   readln ( stdin ) ; 
  716.   k = 0 ; 
  717.   while ( ( k < terminallinelength ) && ! eoln ( stdin ) ) {
  718.       
  719.     buffer [ k ] = xord [ getc ( stdin ) ] ; 
  720.     k = k + 1 ; 
  721.   } 
  722.   buffer [ k ] = 32 ; 
  723. integer getinteger () {
  724.     register integer Result; integer x  ; 
  725.   boolean negative  ; 
  726.   if ( buffer [ bufptr ] == 45 ) 
  727.   {
  728.     negative = true ; 
  729.     bufptr = bufptr + 1 ; 
  730.   } 
  731.   else negative = false ; 
  732.   x = 0 ; 
  733.   while ( ( buffer [ bufptr ] >= 48 ) && ( buffer [ bufptr ] <= 57 ) ) {
  734.       
  735.     x = 10 * x + buffer [ bufptr ] - 48 ; 
  736.     bufptr = bufptr + 1 ; 
  737.   } 
  738.   if ( negative ) 
  739.   Result = - (integer) x ; 
  740.   else Result = x ; 
  741.   return(Result) ; 
  742. dialog () {
  743.     /* 1 2 3 4 5 */ integer k  ; 
  744.   lab1:
  745.   outmode = 2 ; 
  746.   lab2:
  747.   startvals = 0 ; 
  748.   lab3:
  749.   maxpages = 1000000L ; 
  750.   lab4:
  751.   resolution = 72000.0 ; 
  752.   lab5:
  753.   newmag = 0 ; 
  754.  
  755. zdefinefont ( e ) 
  756. integer e ; 
  757. {integer f  ; 
  758.   integer p  ; 
  759.   integer n  ; 
  760.   integer c, q, d  ; 
  761.   integer r  ; 
  762.   integer j, k  ; 
  763.   boolean mismatch  ; 
  764.   if ( nf == maxfonts ) 
  765.   {
  766.     tfatal ("(dviread) Too many fonts in dvi file");
  767.     uexit ( 1 ) ; 
  768.   } 
  769.   fontnum [ nf ] = e ; 
  770.   f = 0 ; 
  771.   while ( fontnum [ f ] != e ) f = f + 1 ; 
  772.   c = signedquad () ; 
  773.   fontchecksum [ nf ] = c ; 
  774.   q = signedquad () ; 
  775.   fontscaledsize [ nf ] = q ; 
  776.   d = signedquad () ; 
  777.   fontdesignsize [ nf ] = d ; 
  778.   p = getbyte () ; 
  779.   n = getbyte () ; 
  780.   if ( fontname [ nf ] + n + p > namesize ) 
  781.   {
  782.     tfatal ("(dviread) name capacity exceeded");
  783.     uexit ( 1 ) ; 
  784.   } 
  785.   fontname [ nf + 1 ] = fontname [ nf ] + n + p ; 
  786.   if ( n + p == 0 ) 
  787.   (void) Fputs( stderr ,  "null font name!" ) ; 
  788.   else {
  789.       register integer for_end; k = fontname [ nf ] ; for_end = fontname [ 
  790.   nf + 1 ] - 1 ; if ( k <= for_end) do 
  791.     names [ k ] = getbyte () ; 
  792.   while ( k++ < for_end ) ; } 
  793.   nf = nf + 1 ; 
  794.   setfontname(nf-1);
  795.   nf = nf - 1 ; 
  796.   if ( ( ( outmode == 3 ) && inpostamble ) || ( ( outmode < 3 ) && ! 
  797.   inpostamble ) ) 
  798.   {
  799.     if ( f < nf ) 
  800.     tfatal ("(dviread) bad dvi file (repeated font def)");
  801.   } 
  802.   else {
  803.       
  804.     if ( f == nf ) 
  805.     tfatal ("(dviread) bad dvi file (fontsel before fontdef)");
  806.   } 
  807.   if ( f == nf ) 
  808.   {
  809.     {register integer for_end; k = 1 ; for_end = namelength ; if ( k <= 
  810.     for_end) do 
  811.       curname [ k ] = ' ' ; 
  812.     while ( k++ < for_end ) ; } 
  813.     r = 0 ; 
  814.     {register integer for_end; k = fontname [ nf ] ; for_end = fontname [ nf 
  815.     + 1 ] - 1 ; if ( k <= for_end) do 
  816.       {
  817.         r = r + 1 ; 
  818.         if ( r + 4 > namelength ) 
  819.         {
  820.           tfatal ("(dviread) capacity exceeded (font name too long)");
  821.           uexit ( 1 ) ; 
  822.         } 
  823.         curname [ r ] = xchr [ names [ k ] ] ; 
  824.       } 
  825.     while ( k++ < for_end ) ; } 
  826.     curname [ r + 1 ] = '.' ; 
  827.     curname [ r + 2 ] = 't' ; 
  828.     curname [ r + 3 ] = 'f' ; 
  829.     curname [ r + 4 ] = 'm' ; 
  830.     opentfmfile () ; 
  831.     if ( eof ( tfmfile ) ) 
  832.     (void) Fputs( stderr ,  "---not loaded, TFM file can't be opened!" ) ; 
  833.     else {
  834.         
  835.       if ( ( q <= 0 ) || ( q >= 134217728L ) ) 
  836.       tfatal ("(dviread) bad dvi file (scale)");
  837.       else if ( ( d <= 0 ) || ( d >= 134217728L ) ) 
  838.       tfatal ("(dviread) bad tfm file (bad design size)");
  839.       else if ( inTFM ( q ) ) 
  840.       {
  841.         fontspace [ nf ] = q / 6 ; 
  842.         if ( ( c != 0 ) && ( tfmchecksum != 0 ) && ( c != tfmchecksum ) ) 
  843.         {
  844.           fatal ("(dviread) WARNING: tfm checksum does not match");
  845.         } 
  846.         d = round ( ( 100.0 * conv * q ) / ((double) ( trueconv * d ) ) ) ; 
  847.         font_size = q; /*WIMP*/
  848.         nf = nf + 1 ; 
  849.         fontspace [ nf ] = 0 ; 
  850.       } 
  851.     } 
  852.   } 
  853.   else {
  854.       
  855.     if ( fontchecksum [ f ] != c ) 
  856.     tfatal ("(dviread) inconsistency (check sum doesn't match previous definition)");
  857.     if ( fontscaledsize [ f ] != q ) 
  858.     tfatal ("(dviread) inconsistency (scaled size doesn't match previous definition)");
  859.     if ( fontdesignsize [ f ] != d ) 
  860.     tfatal ("(dviread) inconsistency (design size doesn't match previous definition)");
  861.     j = fontname [ f ] ; 
  862.     k = fontname [ nf ] ; 
  863.     mismatch = false ; 
  864.     while ( j < fontname [ f + 1 ] ) {
  865.         
  866.       if ( names [ j ] != names [ k ] ) 
  867.       mismatch = true ; 
  868.       j = j + 1 ; 
  869.       k = k + 1 ; 
  870.     } 
  871.     if ( k != fontname [ nf + 1 ] ) 
  872.     mismatch = true ; 
  873.     if ( mismatch ) 
  874.     tfatal ("(dviread) inconsistency (font name doesn't match previous definition)");
  875.   } 
  876. flushtext () {
  877. integer k; 
  878.   if ( textptr > 0 ) {
  879.     if ( outmode > 0 ) {
  880.       register integer for_end;
  881.        k = 1 ;
  882.        if (xchr [ textbuf [ k ] ] == ' ') k++; /****** FUDGE!!! ******/
  883.        for_end = textptr ;
  884.        if ( k <= for_end) {
  885.          char text[256]; char *textp = &text[0];
  886.          do {
  887.            *textp++ = xchr [ textbuf [ k ] ];
  888.          } while ( k++ < for_end );
  889.          *textp = '\0';
  890.          DRAW_text(oldhh, oldvv, hh+font_charwidth, vv, text);  /*WIMPHOOK*/
  891.          oldhh = -1; oldvv = -1;
  892.        } 
  893.     } 
  894.     textptr = 0 ; 
  895.   } 
  896. zouttext ( c ) 
  897. ASCIIcode c ; 
  898. {if ( textptr == linelength - 2 ) 
  899.   flushtext () ; 
  900.   textptr = textptr + 1 ; 
  901.   textbuf [ textptr ] = c ; 
  902. integer zfirstpar ( o ) 
  903. eightbits o ; 
  904. {register integer Result; switch ( o ) 
  905.   {case 0 : 
  906.   case 1 : 
  907.   case 2 : 
  908.   case 3 : 
  909.   case 4 : 
  910.   case 5 : 
  911.   case 6 : 
  912.   case 7 : 
  913.   case 8 : 
  914.   case 9 : 
  915.   case 10 : 
  916.   case 11 : 
  917.   case 12 : 
  918.   case 13 : 
  919.   case 14 : 
  920.   case 15 : 
  921.   case 16 : 
  922.   case 17 : 
  923.   case 18 : 
  924.   case 19 : 
  925.   case 20 : 
  926.   case 21 : 
  927.   case 22 : 
  928.   case 23 : 
  929.   case 24 : 
  930.   case 25 : 
  931.   case 26 : 
  932.   case 27 : 
  933.   case 28 : 
  934.   case 29 : 
  935.   case 30 : 
  936.   case 31 : 
  937.   case 32 : 
  938.   case 33 : 
  939.   case 34 : 
  940.   case 35 : 
  941.   case 36 : 
  942.   case 37 : 
  943.   case 38 : 
  944.   case 39 : 
  945.   case 40 : 
  946.   case 41 : 
  947.   case 42 : 
  948.   case 43 : 
  949.   case 44 : 
  950.   case 45 : 
  951.   case 46 : 
  952.   case 47 : 
  953.   case 48 : 
  954.   case 49 : 
  955.   case 50 : 
  956.   case 51 : 
  957.   case 52 : 
  958.   case 53 : 
  959.   case 54 : 
  960.   case 55 : 
  961.   case 56 : 
  962.   case 57 : 
  963.   case 58 : 
  964.   case 59 : 
  965.   case 60 : 
  966.   case 61 : 
  967.   case 62 : 
  968.   case 63 : 
  969.   case 64 : 
  970.   case 65 : 
  971.   case 66 : 
  972.   case 67 : 
  973.   case 68 : 
  974.   case 69 : 
  975.   case 70 : 
  976.   case 71 : 
  977.   case 72 : 
  978.   case 73 : 
  979.   case 74 : 
  980.   case 75 : 
  981.   case 76 : 
  982.   case 77 : 
  983.   case 78 : 
  984.   case 79 : 
  985.   case 80 : 
  986.   case 81 : 
  987.   case 82 : 
  988.   case 83 : 
  989.   case 84 : 
  990.   case 85 : 
  991.   case 86 : 
  992.   case 87 : 
  993.   case 88 : 
  994.   case 89 : 
  995.   case 90 : 
  996.   case 91 : 
  997.   case 92 : 
  998.   case 93 : 
  999.   case 94 : 
  1000.   case 95 : 
  1001.   case 96 : 
  1002.   case 97 : 
  1003.   case 98 : 
  1004.   case 99 : 
  1005.   case 100 : 
  1006.   case 101 : 
  1007.   case 102 : 
  1008.   case 103 : 
  1009.   case 104 : 
  1010.   case 105 : 
  1011.   case 106 : 
  1012.   case 107 : 
  1013.   case 108 : 
  1014.   case 109 : 
  1015.   case 110 : 
  1016.   case 111 : 
  1017.   case 112 : 
  1018.   case 113 : 
  1019.   case 114 : 
  1020.   case 115 : 
  1021.   case 116 : 
  1022.   case 117 : 
  1023.   case 118 : 
  1024.   case 119 : 
  1025.   case 120 : 
  1026.   case 121 : 
  1027.   case 122 : 
  1028.   case 123 : 
  1029.   case 124 : 
  1030.   case 125 : 
  1031.   case 126 : 
  1032.   case 127 : 
  1033.     Result = o - 0 ; 
  1034.     break ; 
  1035.   case 128 : 
  1036.   case 133 : 
  1037.   case 235 : 
  1038.   case 239 : 
  1039.   case 243 : 
  1040.     Result = getbyte () ; 
  1041.     break ; 
  1042.   case 129 : 
  1043.   case 134 : 
  1044.   case 236 : 
  1045.   case 240 : 
  1046.   case 244 : 
  1047.     Result = gettwobytes () ; 
  1048.     break ; 
  1049.   case 130 : 
  1050.   case 135 : 
  1051.   case 237 : 
  1052.   case 241 : 
  1053.   case 245 : 
  1054.     Result = getthreebytes () ; 
  1055.     break ; 
  1056.   case 143 : 
  1057.   case 148 : 
  1058.   case 153 : 
  1059.   case 157 : 
  1060.   case 162 : 
  1061.   case 167 : 
  1062.     Result = signedbyte () ; 
  1063.     break ; 
  1064.   case 144 : 
  1065.   case 149 : 
  1066.   case 154 : 
  1067.   case 158 : 
  1068.   case 163 : 
  1069.   case 168 : 
  1070.     Result = signedpair () ; 
  1071.     break ; 
  1072.   case 145 : 
  1073.   case 150 : 
  1074.   case 155 : 
  1075.   case 159 : 
  1076.   case 164 : 
  1077.   case 169 : 
  1078.     Result = signedtrio () ; 
  1079.     break ; 
  1080.   case 131 : 
  1081.   case 132 : 
  1082.   case 136 : 
  1083.   case 137 : 
  1084.   case 146 : 
  1085.   case 151 : 
  1086.   case 156 : 
  1087.   case 160 : 
  1088.   case 165 : 
  1089.   case 170 : 
  1090.   case 238 : 
  1091.   case 242 : 
  1092.   case 246 : 
  1093.     Result = signedquad () ; 
  1094.     break ; 
  1095.   case 138 : 
  1096.   case 139 : 
  1097.   case 140 : 
  1098.   case 141 : 
  1099.   case 142 : 
  1100.   case 247 : 
  1101.   case 248 : 
  1102.   case 249 : 
  1103.   case 250 : 
  1104.   case 251 : 
  1105.   case 252 : 
  1106.   case 253 : 
  1107.   case 254 : 
  1108.   case 255 : 
  1109.     Result = 0 ; 
  1110.     break ; 
  1111.   case 147 : 
  1112.     Result = w ; 
  1113.     break ; 
  1114.   case 152 : 
  1115.     Result = x ; 
  1116.     break ; 
  1117.   case 161 : 
  1118.     Result = y ; 
  1119.     break ; 
  1120.   case 166 : 
  1121.     Result = z ; 
  1122.     break ; 
  1123.   case 171 : 
  1124.   case 172 : 
  1125.   case 173 : 
  1126.   case 174 : 
  1127.   case 175 : 
  1128.   case 176 : 
  1129.   case 177 : 
  1130.   case 178 : 
  1131.   case 179 : 
  1132.   case 180 : 
  1133.   case 181 : 
  1134.   case 182 : 
  1135.   case 183 : 
  1136.   case 184 : 
  1137.   case 185 : 
  1138.   case 186 : 
  1139.   case 187 : 
  1140.   case 188 : 
  1141.   case 189 : 
  1142.   case 190 : 
  1143.   case 191 : 
  1144.   case 192 : 
  1145.   case 193 : 
  1146.   case 194 : 
  1147.   case 195 : 
  1148.   case 196 : 
  1149.   case 197 : 
  1150.   case 198 : 
  1151.   case 199 : 
  1152.   case 200 : 
  1153.   case 201 : 
  1154.   case 202 : 
  1155.   case 203 : 
  1156.   case 204 : 
  1157.   case 205 : 
  1158.   case 206 : 
  1159.   case 207 : 
  1160.   case 208 : 
  1161.   case 209 : 
  1162.   case 210 : 
  1163.   case 211 : 
  1164.   case 212 : 
  1165.   case 213 : 
  1166.   case 214 : 
  1167.   case 215 : 
  1168.   case 216 : 
  1169.   case 217 : 
  1170.   case 218 : 
  1171.   case 219 : 
  1172.   case 220 : 
  1173.   case 221 : 
  1174.   case 222 : 
  1175.   case 223 : 
  1176.   case 224 : 
  1177.   case 225 : 
  1178.   case 226 : 
  1179.   case 227 : 
  1180.   case 228 : 
  1181.   case 229 : 
  1182.   case 230 : 
  1183.   case 231 : 
  1184.   case 232 : 
  1185.   case 233 : 
  1186.   case 234 : 
  1187.     Result = o - 171 ; 
  1188.     break ; 
  1189.   } 
  1190.   return(Result) ; 
  1191. integer zrulepixels ( x ) 
  1192. integer x ; 
  1193. {register integer Result; integer n  ; 
  1194.   n = trunc ( conv * x ) ; 
  1195.   if ( n < conv * x ) 
  1196.   Result = n + 1 ; 
  1197.   else Result = n ; 
  1198.   return(Result) ; 
  1199. boolean zspecialcases ( o , p , a ) 
  1200. eightbits o ; 
  1201. integer p , a ; 
  1202. {/* 46 44 30 9998 */ register boolean Result; integer q  ; 
  1203.   integer k  ; 
  1204.   boolean badchar  ; 
  1205.   boolean pure  ; 
  1206.   integer vvv  ; 
  1207.   pure = true ; 
  1208.   switch ( o ) 
  1209.   {case 157 : 
  1210.   case 158 : 
  1211.   case 159 : 
  1212.   case 160 : 
  1213.     {
  1214.       if ( abs ( p ) >= 5 * fontspace [ curfont ] ) 
  1215.       vv = round ( conv * ( v + p ) ) ; 
  1216.       else vv = vv + round ( conv * ( p ) ) ; 
  1217.       if ( outmode > 0 ) 
  1218.       {
  1219.         flushtext () ; 
  1220.         showing = true ; 
  1221.       } 
  1222.       goto lab44 ; 
  1223.     } 
  1224.     break ; 
  1225.   case 161 : 
  1226.   case 162 : 
  1227.   case 163 : 
  1228.   case 164 : 
  1229.   case 165 : 
  1230.     {
  1231.       y = p ; 
  1232.       if ( abs ( p ) >= 5 * fontspace [ curfont ] ) 
  1233.       vv = round ( conv * ( v + p ) ) ; 
  1234.       else vv = vv + round ( conv * ( p ) ) ; 
  1235.       if ( outmode > 0 ) 
  1236.       {
  1237.         flushtext () ; 
  1238.         showing = true ; 
  1239.       } 
  1240.       goto lab44 ; 
  1241.     } 
  1242.     break ; 
  1243.   case 166 : 
  1244.   case 167 : 
  1245.   case 168 : 
  1246.   case 169 : 
  1247.   case 170 : 
  1248.     {
  1249.       z = p ; 
  1250.       if ( abs ( p ) >= 5 * fontspace [ curfont ] ) 
  1251.       vv = round ( conv * ( v + p ) ) ; 
  1252.       else vv = vv + round ( conv * ( p ) ) ; 
  1253.       if ( outmode > 0 ) 
  1254.       {
  1255.         flushtext () ; 
  1256.         showing = true ; 
  1257.       } 
  1258.       goto lab44 ; 
  1259.     } 
  1260.     break ; 
  1261.   case 171 : 
  1262.   case 172 : 
  1263.   case 173 : 
  1264.   case 174 : 
  1265.   case 175 : 
  1266.   case 176 : 
  1267.   case 177 : 
  1268.   case 178 : 
  1269.   case 179 : 
  1270.   case 180 : 
  1271.   case 181 : 
  1272.   case 182 : 
  1273.   case 183 : 
  1274.   case 184 : 
  1275.   case 185 : 
  1276.   case 186 : 
  1277.   case 187 : 
  1278.   case 188 : 
  1279.   case 189 : 
  1280.   case 190 : 
  1281.   case 191 : 
  1282.   case 192 : 
  1283.   case 193 : 
  1284.   case 194 : 
  1285.   case 195 : 
  1286.   case 196 : 
  1287.   case 197 : 
  1288.   case 198 : 
  1289.   case 199 : 
  1290.   case 200 : 
  1291.   case 201 : 
  1292.   case 202 : 
  1293.   case 203 : 
  1294.   case 204 : 
  1295.   case 205 : 
  1296.   case 206 : 
  1297.   case 207 : 
  1298.   case 208 : 
  1299.   case 209 : 
  1300.   case 210 : 
  1301.   case 211 : 
  1302.   case 212 : 
  1303.   case 213 : 
  1304.   case 214 : 
  1305.   case 215 : 
  1306.   case 216 : 
  1307.   case 217 : 
  1308.   case 218 : 
  1309.   case 219 : 
  1310.   case 220 : 
  1311.   case 221 : 
  1312.   case 222 : 
  1313.   case 223 : 
  1314.   case 224 : 
  1315.   case 225 : 
  1316.   case 226 : 
  1317.   case 227 : 
  1318.   case 228 : 
  1319.   case 229 : 
  1320.   case 230 : 
  1321.   case 231 : 
  1322.   case 232 : 
  1323.   case 233 : 
  1324.   case 234 : 
  1325.     {
  1326.       if ( outmode > 0 ) 
  1327.       {
  1328.         flushtext () ; 
  1329.         showing = true ; 
  1330.         DRAW_selfont(p);  /*WIMPHOOK*/
  1331.       } 
  1332.       goto lab46 ; 
  1333.     } 
  1334.     break ; 
  1335.   case 235 : 
  1336.   case 236 : 
  1337.   case 237 : 
  1338.   case 238 : 
  1339.     {
  1340.       if ( outmode > 0 ) 
  1341.       {
  1342.         flushtext () ; 
  1343.         showing = true ; 
  1344.         DRAW_selfont(p);  /*WIMPHOOK*/
  1345.       } 
  1346.       goto lab46 ; 
  1347.     } 
  1348.     break ; 
  1349.   case 243 : 
  1350.   case 244 : 
  1351.   case 245 : 
  1352.   case 246 : 
  1353.     {
  1354.       if ( outmode > 0 ) 
  1355.       {
  1356.         flushtext () ; 
  1357.         showing = true ; 
  1358.       } 
  1359.       definefont ( p ) ; 
  1360.       DRAW_deffont(p, font_name, font_size>>12, mag);  /*WIMPHOOK*/
  1361.       goto lab30 ; 
  1362.     } 
  1363.     break ; 
  1364.   case 239 : 
  1365.   case 240 : 
  1366.   case 241 : 
  1367.   case 242 : 
  1368.     {
  1369.       if ( outmode > 0 ) 
  1370.       {
  1371.         flushtext () ; 
  1372.         showing = true ; 
  1373.         /* We regressed a version since IAY was working from 1.0 and
  1374.            we were at 1.1 -- so let's redo this 'fix' */
  1375.         /*tfatal ("BARF %ld%s%s",  (long)a , ": " , "xxx '" ) ; */
  1376.       } 
  1377.       badchar = false ; 
  1378.       if ( p < 0 ) 
  1379.       if ( ! showing ) 
  1380.       {
  1381.         flushtext () ; 
  1382.         showing = true ; 
  1383.         tfatal ("(dviread) bad dvi file (string of negative length)");
  1384.       } 
  1385.       else
  1386.       tfatal ("(dviread) bad dvi file (string of negative length)");
  1387.       {register integer for_end; k = 1 ; for_end = p ; if ( k <= for_end) do 
  1388.         {
  1389.           q = getbyte () ; 
  1390.           if ( ( q < 32 ) || ( q > 126 ) ) 
  1391.           badchar = true ; 
  1392.           if ( showing ) 
  1393.           (void) putc( xchr [ q ] ,  stderr );
  1394.         } 
  1395.       while ( k++ < for_end ) ; } 
  1396.       if ( showing ) 
  1397.       (void) putc( '\'' ,  stderr );
  1398.       if ( badchar ) 
  1399.       if ( ! showing ) 
  1400.       {
  1401.         flushtext () ; 
  1402.         showing = true ; 
  1403.         tfatal ("(dviread) bad dvi file (non-ASCII character in xxx command)");
  1404.       } 
  1405.       else
  1406.       tfatal ("(dviread) bad dvi file (non-ASCII character in xxx command)");
  1407.       goto lab30 ; 
  1408.     } 
  1409.     break ; 
  1410.   case 247 : 
  1411.     {
  1412.       if ( ! showing ) 
  1413.       {
  1414.         flushtext () ; 
  1415.         showing = true ; 
  1416.         tfatal ("(dviread) bad dvi file (preamble command within a page)");
  1417.       } 
  1418.       else
  1419.       tfatal ("(dviread) bad dvi file (preamble command within a page)");
  1420.       goto lab9998 ; 
  1421.     } 
  1422.     break ; 
  1423.   case 248 : 
  1424.   case 249 : 
  1425.     {
  1426.       if ( ! showing ) 
  1427.       {
  1428.         flushtext () ; 
  1429.         showing = true ; 
  1430.         tfatal ("(dviread) bad dvi file (postamble command within a page)");
  1431.       } 
  1432.       else
  1433.         tfatal ("(dviread) bad dvi file (postamble command within a page)");
  1434.       goto lab9998 ; 
  1435.     } 
  1436.     break ; 
  1437.     default: 
  1438.     {
  1439.       if ( ! showing ) 
  1440.       {
  1441.         flushtext () ; 
  1442.         showing = true ; 
  1443.         tfatal ("(dviread) bad dfi file (undefined command)");
  1444.       } 
  1445.       else
  1446.         tfatal ("(dviread) bad dfi file (undefined command)");
  1447.       goto lab30 ; 
  1448.     } 
  1449.     break ; 
  1450.   } 
  1451.   lab44: if ( ( v > 0 ) && ( p > 0 ) ) 
  1452.   if ( v > 2147483647L - p ) 
  1453.   {
  1454.     if ( ! showing ) 
  1455.     {
  1456.       flushtext () ; 
  1457.       showing = true ; 
  1458.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, 2147483647L - v );
  1459.     } 
  1460.     else
  1461.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, 2147483647L - v );
  1462.     p = 2147483647L - v ; 
  1463.   } 
  1464.   if ( ( v < 0 ) && ( p < 0 ) ) 
  1465.   if ( - (integer) v > p + 2147483647L ) 
  1466.   {
  1467.     if ( ! showing ) 
  1468.     {
  1469.       flushtext () ; 
  1470.       showing = true ; 
  1471.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, (int) (-v - 2147483647L));
  1472.     } 
  1473.     else
  1474.       fatal ("(dviread) WARNING: arithmetic overflow! parameter changed from %d to %d", p, (int) (-v - 2147483647L));
  1475.     p = ( - (integer) v ) - 2147483647L ; 
  1476.   } 
  1477.   vvv = round ( conv * ( v + p ) ) ; 
  1478.   if ( abs ( vvv - vv ) > 2 ) 
  1479.   if ( vvv > vv ) 
  1480.   vv = vvv - 2 ; 
  1481.   else vv = vvv + 2 ; 
  1482.   v = v + p ; 
  1483.   if ( abs ( v ) > maxvsofar ) 
  1484.   {
  1485.     if ( abs ( v ) > maxv + 99 ) 
  1486.     {
  1487.       if ( ! showing ) 
  1488.       {
  1489.         flushtext () ; 
  1490.         showing = true ; 
  1491. /*
  1492.         tfatal ("%ld%s%s%ld%c",  (long)a , ": " , "warning: |v|>" , (long)maxv , '!' ) ; 
  1493. */
  1494.       } 
  1495.       else
  1496. /*
  1497.       tfatal ("%c%s%ld%c",  ' ' , "warning: |v|>" , (long)maxv , '!' ) ; 
  1498. */
  1499.       maxv = abs ( v ) ; 
  1500.     } 
  1501.     maxvsofar = abs ( v ) ; 
  1502.   } 
  1503.   goto lab30 ; 
  1504.   lab46: fontnum [ nf ] = p ; 
  1505.   curfont = 0 ; 
  1506.   while ( fontnum [ curfont ] != p ) curfont = curfont + 1 ; 
  1507.   goto lab30 ; 
  1508.   lab9998: pure = false ; 
  1509.   lab30: Result = pure ; 
  1510.   return(Result) ; 
  1511.  
  1512. boolean dopage () {
  1513.     /* 41 42 43 45 30 9998 9999 */ register boolean Result; 
  1514.   eightbits o  ; 
  1515.   integer p, q  ; 
  1516.   integer a  ; 
  1517.   integer hhh  ; 
  1518.   curfont = nf ; 
  1519.   s = 0 ; 
  1520.   h = 0 ; 
  1521.   v = 0 ; 
  1522.   w = 0 ; 
  1523.   x = 0 ; 
  1524.   y = 0 ; 
  1525.   z = 0 ; 
  1526.   hh = 0 ; 
  1527.   vv = 0 ;
  1528.   DRAW_startpage();  /*WIMPHOOK*/
  1529.   while ( true ) {
  1530.       
  1531.     a = curloc ; 
  1532.     showing = false ; 
  1533.     o = getbyte () ; 
  1534.     p = firstpar ( o ) ; 
  1535.     if ( eof ( dvifile ) ) 
  1536.     {
  1537.       tfatal ("(dviread) bad dvi file (the file ended prematurely)");
  1538.       uexit ( 1 ) ; 
  1539.     } 
  1540.     if ( o < 128 ) 
  1541.     {
  1542.       if ( ( o > 32 ) && ( o <= 126 ) ) 
  1543.       {
  1544.         outtext ( p ) ; 
  1545.         if ( outmode >= 2 ) 
  1546.         {
  1547.           showing = true ; 
  1548.           font_charwidth = pixelwidth [ widthbase [ curfont ] + p ];
  1549.           if ((oldhh == -1) && (oldvv == -1)) {
  1550.             oldhh = hh; oldvv = vv;  /* Note start of rectangle */ /*WIMP*/
  1551.           }
  1552.         } 
  1553.       } 
  1554.       else if ( outmode > 0 ) 
  1555.       {
  1556.         flushtext () ; 
  1557.         showing = true ; 
  1558.          DRAW_char(hh, vv, p);  /*WIMPHOOK*/
  1559.       } 
  1560.       goto lab41 ; 
  1561.     } 
  1562.     else switch ( o ) 
  1563.     {case 128 : 
  1564.     case 129 : 
  1565.     case 130 : 
  1566.     case 131 : 
  1567.       {
  1568.         if ( outmode > 0 ) 
  1569.         {
  1570.           flushtext () ; 
  1571.           showing = true ; 
  1572. /*
  1573.           tfatal ("%ld%s%s%ld%c%ld",  (long)a , ": " , "set" , (long)o - 127 , ' ' , (long)p ) ; 
  1574. */
  1575.         } 
  1576.         goto lab41 ; 
  1577.       } 
  1578.       break ; 
  1579.     case 133 : 
  1580.     case 134 : 
  1581.     case 135 : 
  1582.     case 136 : 
  1583.       {
  1584.         if ( outmode > 0 ) 
  1585.         {
  1586.           flushtext () ; 
  1587.           showing = true ; 
  1588. /*
  1589.           tfatal ("%ld%s%s%ld%c%ld",  (long)a , ": " , "put" , (long)o - 132 , ' ' , (long)p ) ; 
  1590. */
  1591.         } 
  1592.         goto lab41 ; 
  1593.       } 
  1594.       break ; 
  1595.     case 132 : 
  1596.       {
  1597.         if ( outmode > 0 ) 
  1598.         {
  1599.           flushtext () ; 
  1600.           showing = true ; 
  1601.         }
  1602.         draw_rule = true; /*WIMP*/
  1603.         goto lab42 ; 
  1604.       } 
  1605.       break ; 
  1606.     case 137 : 
  1607.       {
  1608.         if ( outmode > 0 ) 
  1609.         {
  1610.           flushtext () ; 
  1611.           showing = true ; 
  1612.         } 
  1613.         draw_rule = true;/*WIMP*/
  1614.         goto lab42 ; 
  1615.       } 
  1616.       break ; 
  1617.     case 138 : 
  1618.       {
  1619.         if ( outmode >= 2 ) 
  1620.         {
  1621.           showing = true ; 
  1622. /*
  1623.           tfatal ("%ld%s%s",  (long)a , ": " , "nop" ) ; 
  1624. */
  1625.         } 
  1626.         goto lab30 ; 
  1627.       } 
  1628.       break ; 
  1629.     case 139 : 
  1630.       {
  1631.         if ( ! showing ) 
  1632.         {
  1633.           flushtext () ; 
  1634.           showing = true ; 
  1635.           tfatal ("(dviread) bad dvi file (bop occurred before eop)");
  1636.         } 
  1637.         else
  1638.           tfatal ("(dviread) bad dvi file (bop occurred before eop)");
  1639.         goto lab9998 ; 
  1640.       } 
  1641.       break ; 
  1642.     case 140 : 
  1643.       {
  1644.         if ( outmode > 0 ) 
  1645.         {
  1646.           flushtext () ; 
  1647.           showing = true ; 
  1648.         } 
  1649.         if ( s != 0 ) 
  1650.         if ( ! showing ) 
  1651.         {
  1652.           flushtext () ; 
  1653.           showing = true ; 
  1654.           tfatal ("(dviread) bad dvi file (stack not empty at end of page)");
  1655.         } 
  1656.         else
  1657.           tfatal ("(dviread) bad dvi file (stack not empty at end of page)");
  1658.         Result = true ; 
  1659.         DRAW_endpage(maxh/* page_width */,  maxv/* page_height */,  count/* page_counters */); /*WIMPHOOK*/
  1660.         goto lab9999 ; 
  1661.       } 
  1662.       break ; 
  1663.     case 141 : 
  1664.       {
  1665.         if ( outmode > 0 ) 
  1666.         {
  1667.           flushtext () ; 
  1668.           showing = true ; 
  1669.         } 
  1670.         if ( s == maxssofar ) 
  1671.         {
  1672.           maxssofar = s + 1 ; 
  1673.           if ( s == maxs ) 
  1674.           if ( ! showing ) 
  1675.           {
  1676.             flushtext () ; 
  1677.             showing = true ; 
  1678.             tfatal ("(dviread) bad dvi file (deeper than claimed in postamble)");
  1679.           } 
  1680.           else
  1681.             tfatal ("(dviread) bad dvi file (deeper than claimed in postamble)");
  1682.           ; 
  1683.           if ( s == stacksize ) 
  1684.           {
  1685.             if ( ! showing ) 
  1686.             {
  1687.               flushtext () ; 
  1688.               showing = true ; 
  1689.               tfatal ("(dviread) capacity exceeded (stack)");
  1690.             } 
  1691.             else
  1692.               tfatal ("(dviread) capacity exceeded (stack)");
  1693.             goto lab9998 ; 
  1694.           } 
  1695.         } 
  1696.         hstack [ s ] = h ; 
  1697.         vstack [ s ] = v ; 
  1698.         wstack [ s ] = w ; 
  1699.         xstack [ s ] = x ; 
  1700.         ystack [ s ] = y ; 
  1701.         zstack [ s ] = z ; 
  1702.         hhstack [ s ] = hh ; 
  1703.         vvstack [ s ] = vv ; 
  1704.         s = s + 1 ; 
  1705.         ss = s - 1 ; 
  1706.         goto lab45 ; 
  1707.       } 
  1708.       break ; 
  1709.     case 142 : 
  1710.       {
  1711.         if ( outmode > 0 ) 
  1712.         {
  1713.           flushtext () ; 
  1714.           showing = true ; 
  1715.         } 
  1716.         if ( s == 0 ) 
  1717.         if ( ! showing ) 
  1718.         {
  1719.           flushtext () ; 
  1720.           showing = true ; 
  1721.           tfatal ("(dviread) bad dvi file"); 
  1722.         } 
  1723.         else
  1724.           tfatal ("(dviread) bad dvi file");
  1725.         else {
  1726.             
  1727.           s = s - 1 ; 
  1728.           hh = hhstack [ s ] ; 
  1729.           vv = vvstack [ s ] ; 
  1730.           h = hstack [ s ] ; 
  1731.           v = vstack [ s ] ; 
  1732.           w = wstack [ s ] ; 
  1733.           x = xstack [ s ] ; 
  1734.           y = ystack [ s ] ; 
  1735.           z = zstack [ s ] ; 
  1736.         } 
  1737.         ss = s ; 
  1738.         goto lab45 ; 
  1739.       } 
  1740.       break ; 
  1741.     case 143 : 
  1742.     case 144 : 
  1743.     case 145 : 
  1744.     case 146 : 
  1745.       {
  1746. #ifdef PROPER
  1747.         if ( ( p >= fontspace [ curfont ] ) || ( p <= -4 * fontspace [ curfont 
  1748.         ] ) ) 
  1749.         {
  1750.           outtext ( 32 ) ; 
  1751.           hh = round ( conv * ( h + p ) ) ; 
  1752.         } 
  1753.         else
  1754. #endif
  1755.         {
  1756.           if (outmode > 0) flushtext();
  1757.           hh = hh + round ( conv * ( p ) ) ; 
  1758.         }
  1759.         if ( outmode >= 2 ) 
  1760.         {
  1761.           showing = true ; 
  1762.         } 
  1763.         q = p ; 
  1764.         goto lab43 ; 
  1765.       } 
  1766.       break ; 
  1767.     case 147 : 
  1768.     case 148 : 
  1769.     case 149 : 
  1770.     case 150 : 
  1771.     case 151 : 
  1772.       {
  1773.         w = p ; 
  1774. #ifdef PROPER
  1775.         if ( ( p >= fontspace [ curfont ] ) || ( p <= -4 * fontspace [ curfont 
  1776.         ] ) ) 
  1777.         {
  1778.           outtext ( 32 ) ; 
  1779.           hh = round ( conv * ( h + p ) ) ; 
  1780.         } 
  1781.         else
  1782. #endif
  1783.         {
  1784.           if (outmode > 0) flushtext();
  1785.           hh = hh + round ( conv * ( p ) ) ; 
  1786.         }
  1787.         if ( outmode >= 2 ) 
  1788.         {
  1789.           showing = true ; 
  1790.         } 
  1791.         q = p ; 
  1792.         goto lab43 ; 
  1793.       } 
  1794.       break ; 
  1795.     case 152 : 
  1796.     case 153 : 
  1797.     case 154 : 
  1798.     case 155 : 
  1799.     case 156 : 
  1800.       {
  1801.         x = p ; 
  1802. #ifdef PROPER
  1803.         if ( ( p >= fontspace [ curfont ] ) || ( p <= -4 * fontspace [ curfont 
  1804.         ] ) ) 
  1805.         {
  1806.           outtext ( 32 ) ; 
  1807.           hh = round ( conv * ( h + p ) ) ; 
  1808.         } 
  1809.         else
  1810. #endif
  1811.         {
  1812.           if (outmode > 0) flushtext();
  1813.           hh = hh + round ( conv * ( p ) ) ; 
  1814.         }
  1815.         if ( outmode >= 2 ) 
  1816.         {
  1817.           showing = true ; 
  1818.         } 
  1819.         q = p ; 
  1820.         goto lab43 ; 
  1821.       } 
  1822.       break ; 
  1823.       default: 
  1824.       if ( specialcases ( o , p , a ) ) 
  1825.       goto lab30 ; 
  1826.       else goto lab9998 ; 
  1827.       break ; 
  1828.     } 
  1829.     lab41: if ( p < 0 ) 
  1830.     p = 255 - ( ( -1 - p ) % 256 ) ; 
  1831.     else if ( p >= 256 ) 
  1832.     p = p % 256 ; 
  1833.     if ( ( p < fontbc [ curfont ] ) || ( p > fontec [ curfont ] ) ) 
  1834.     q = 2147483647L ; 
  1835.     else q = width [ widthbase [ curfont ] + p ] ; 
  1836.     if ( q == 2147483647L ) 
  1837.     {
  1838.       if ( ! showing ) 
  1839.       {
  1840.         flushtext () ; 
  1841.         showing = true ; 
  1842.         tfatal ("(dviread) bad dvi file (character invalid in font)"); 
  1843.       } 
  1844.       else
  1845.         tfatal ("(dviread) bad dvi file (character invalid in font)");
  1846.       printfont ( curfont ) ; 
  1847.       if ( curfont != nf ) 
  1848.       (void) putc( '!' ,  stderr );
  1849.     } 
  1850.     if ( o >= 133 ) 
  1851.     goto lab30 ; 
  1852.     if ( q == 2147483647L ) 
  1853.     q = 0 ; 
  1854.     else hh = hh + pixelwidth [ widthbase [ curfont ] + p ] ; 
  1855.     goto lab43 ; 
  1856.     lab42: q = signedquad () ; 
  1857.     if ( showing ) 
  1858.     {
  1859.       if ( ( p <= 0 ) || ( q <= 0 ) ) {
  1860.         (void) Fputs( stderr ,  " (invisible)" ) ; 
  1861.       } else {
  1862.         if (draw_rule) {
  1863.           DRAW_rule(hh, vv, (long)rulepixels ( p ) ,
  1864.                             (long)rulepixels ( q ));
  1865.         }
  1866.       }
  1867.     } 
  1868.     draw_rule = false;
  1869.     if ( o == 137 ) 
  1870.     goto lab30 ; 
  1871.     hh = hh + rulepixels ( q ) ; 
  1872.     goto lab43 ; 
  1873.     lab43: if ( ( h > 0 ) && ( q > 0 ) ) 
  1874.     if ( h > 2147483647L - q ) 
  1875.     {
  1876.       if ( ! showing ) 
  1877.       {
  1878.         flushtext () ; 
  1879.         showing = true ; 
  1880.         tfatal ("%ld%s%s%ld%s%ld",  (long)a , ": " ,         "arithmetic overflow! parameter changed from " , (long)q , " to " ,         (long)2147483647L - h ) ; 
  1881.       } 
  1882.       else
  1883.       tfatal ("%c%s%ld%s%ld",  ' ' ,       "arithmetic overflow! parameter changed from " , (long)q , " to " ,       (long)2147483647L - h ) ; 
  1884.       q = 2147483647L - h ; 
  1885.     } 
  1886.     if ( ( h < 0 ) && ( q < 0 ) ) 
  1887.     if ( - (integer) h > q + 2147483647L ) 
  1888.     {
  1889.       if ( ! showing ) 
  1890.       {
  1891.         flushtext () ; 
  1892.         showing = true ; 
  1893.         tfatal ("%ld%s%s%ld%s%ld",  (long)a , ": " ,         "arithmetic overflow! parameter changed from " , (long)q , " to " , (long)(         - (integer) h ) - 2147483647L ) ; 
  1894.       } 
  1895.       else
  1896.       tfatal ("%c%s%ld%s%ld",  ' ' ,       "arithmetic overflow! parameter changed from " , (long)q , " to " , (long)(       - (integer) h ) - 2147483647L ) ; 
  1897.       q = ( - (integer) h ) - 2147483647L ; 
  1898.     } 
  1899.     hhh = round ( conv * ( h + q ) ) ; 
  1900.     if ( abs ( hhh - hh ) > 2 ) 
  1901.     if ( hhh > hh ) 
  1902.     hh = hhh - 2 ; 
  1903.     else hh = hhh + 2 ; 
  1904.     h = h + q ; 
  1905.     if ( abs ( h ) > maxhsofar ) 
  1906.     {
  1907.       if ( abs ( h ) > maxh + 99 ) 
  1908.       {
  1909.         if ( ! showing ) 
  1910.         {
  1911.           flushtext () ; 
  1912.           showing = true ; 
  1913.           tfatal ("%ld%s%s%ld%c",  (long)a , ": " , "warning: |h|>" , (long)maxh , '!' ) ; 
  1914.         } 
  1915.         else
  1916.         tfatal ("%c%s%ld%c",  ' ' , "warning: |h|>" , (long)maxh , '!' ) ; 
  1917.         maxh = abs ( h ) ; 
  1918.       } 
  1919.       maxhsofar = abs ( h ) ; 
  1920.     } 
  1921.     goto lab30 ; 
  1922.     lab45: if ( showing ) 
  1923.     {
  1924.     } 
  1925.     goto lab30 ; 
  1926.     lab30: ;
  1927.   } 
  1928.   lab9998: tfatal ("%c\n",  '!' ) ; 
  1929.   Result = false ; 
  1930.   lab9999: ; 
  1931.   return(Result) ; 
  1932. skippages () {
  1933.     /* 9999 */ integer p  ; 
  1934.   unsigned char k  ; 
  1935.   integer downthedrain  ; 
  1936.   showing = false ; 
  1937.   while ( true ) {
  1938.       
  1939.     if ( eof ( dvifile ) ) 
  1940.     {
  1941.       tfatal ("%c%s%s%c",  ' ' , "Bad DVI file: " , "the file ended prematurely"       , '!' ) ; 
  1942.       uexit ( 1 ) ; 
  1943.     } 
  1944.     k = getbyte () ; 
  1945.     p = firstpar ( k ) ; 
  1946.     switch ( k ) 
  1947.     {case 139 : 
  1948.       {
  1949.         newbackpointer = curloc - 1 ; 
  1950.         pagecount = pagecount + 1 ; 
  1951.         {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) 
  1952.         do 
  1953.           count [ k ] = signedquad () ; 
  1954.         while ( k++ < for_end ) ; } 
  1955.         if ( signedquad () != oldbackpointer ) 
  1956.         tfatal ("%s%ld%s%ld%c\n",  "backpointer in byte " , (long)curloc - 4 ,         " should be " , (long)oldbackpointer , '!' ) ; 
  1957.         oldbackpointer = newbackpointer ; 
  1958.         if ( ! started && startmatch () ) 
  1959.         {
  1960.           started = true ; 
  1961.           goto lab9999 ; 
  1962.         } 
  1963.       } 
  1964.       break ; 
  1965.     case 132 : 
  1966.     case 137 : 
  1967.       downthedrain = signedquad () ; 
  1968.       break ; 
  1969.     case 243 : 
  1970.     case 244 : 
  1971.     case 245 : 
  1972.     case 246 : 
  1973.       {
  1974.         definefont ( p ) ; 
  1975.       } 
  1976.       break ; 
  1977.     case 239 : 
  1978.     case 240 : 
  1979.     case 241 : 
  1980.     case 242 : 
  1981.       while ( p > 0 ) {
  1982.           
  1983.         downthedrain = getbyte () ; 
  1984.         p = p - 1 ; 
  1985.       } 
  1986.       break ; 
  1987.     case 248 : 
  1988.       {
  1989.         inpostamble = true ; 
  1990.         goto lab9999 ; 
  1991.       } 
  1992.       break ; 
  1993.       default: 
  1994.       ; 
  1995.       break ; 
  1996.     } 
  1997.   } 
  1998.   lab9999: ; 
  1999. readpostamble () {
  2000.     integer k  ; 
  2001.   integer p, q, m  ; 
  2002.   showing = false ; 
  2003.   postloc = curloc - 5 ; 
  2004.   if ( signedquad () != numerator ) 
  2005.   tfatal ("%s\n",  "numerator doesn't match the preamble!" ) ; 
  2006.   if ( signedquad () != denominator ) 
  2007.   tfatal ("%s\n",  "denominator doesn't match the preamble!" ) ; 
  2008.   if ( signedquad () != mag ) 
  2009.   if ( newmag == 0 ) 
  2010.   tfatal ("%s\n",  "magnification doesn't match the preamble!" ) ; 
  2011.   maxv = signedquad () ; 
  2012.   maxh = signedquad () ; 
  2013.   maxs = gettwobytes () ; 
  2014.   totalpages = gettwobytes () ; 
  2015.   if ( outmode < 3 ) 
  2016.   {
  2017.     if ( maxv + 99 < maxvsofar ) 
  2018.     tfatal ("%s%ld\n",  "warning: observed maxv was " , (long)maxvsofar ) ; 
  2019.     if ( maxh + 99 < maxhsofar ) 
  2020.     if (debug) fprintf( stderr , "%s%ld\n",  "warning: observed maxh was " , (long)maxhsofar ) ; 
  2021.     if ( maxs < maxssofar ) 
  2022.     tfatal ("%s%ld\n",  "warning: observed maxstackdepth was " , (long)maxssofar ) 
  2023.     ; 
  2024.     if ( pagecount != totalpages ) 
  2025.     tfatal ("%s%ld%s%ld%c\n",  "there are really " , (long)pagecount , " pages, not " ,     (long)totalpages , '!' ) ; 
  2026.   } 
  2027.   do {
  2028.       k = getbyte () ; 
  2029.     if ( ( k >= 243 ) && ( k < 247 ) ) 
  2030.     {
  2031.       p = firstpar ( k ) ; 
  2032.       definefont ( p ) ; 
  2033.       k = 138 ; 
  2034.     } 
  2035.   } while ( ! ( k != 138 ) ) ; 
  2036.   if ( k != 249 ) 
  2037.   tfatal ("%s%ld%s\n",  "byte " , (long)curloc - 1 , " is not postpost!" ) ; 
  2038.   q = signedquad () ; 
  2039.   if ( q != postloc ) 
  2040.   tfatal ("%s%ld%c\n",  "bad postamble pointer in byte " , (long)curloc - 4 , '!' ) ; 
  2041.   m = getbyte () ; 
  2042.   if ( m != 2 ) 
  2043.   tfatal ("%s%ld%s%ld%c\n",  "identification in byte " , (long)curloc - 1 , " should be "   , (long)2 , '!' ) ; 
  2044.   k = curloc ; 
  2045.   m = 223 ; 
  2046.   while ( ( m == 223 ) && ! eof ( dvifile ) ) m = getbyte () ; 
  2047.   if ( ! eof ( dvifile ) ) 
  2048.   {
  2049.     tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "signature in byte " , (long)curloc     - 1 , " should be 223" , '!' ) ; 
  2050.     uexit ( 1 ) ; 
  2051.   } 
  2052.   else if ( curloc < k + 4 ) 
  2053.   tfatal ("%s%ld%c\n",  "not enough signature bytes at end of file (" , (long)curloc   - k , ')' ) ; 
  2054.  
  2055.   /* *Should* be safe now to close the dvifile */
  2056.   fclose(dvifile);
  2057.  
  2058. main_body() {
  2059.     
  2060.   initialize () ; 
  2061.   dialog () ; 
  2062.   opendvifile () ; 
  2063.   p = getbyte () ; 
  2064.   if ( p != 247 ) 
  2065.   {
  2066.     tfatal ("%c%s%s%c",  ' ' , "Bad DVI file: " ,     "First byte isn't start of preamble!" , '!' ) ; 
  2067.     uexit ( 1 ) ; 
  2068.   } 
  2069.   p = getbyte () ; 
  2070.   if ( p != 2 ) 
  2071.   tfatal ("%s%ld%c\n",  "identification in byte 1 should be " , (long)2 , '!' ) ; 
  2072.   numerator = signedquad () ; 
  2073.   denominator = signedquad () ; 
  2074.   if ( numerator <= 0 ) 
  2075.   {
  2076.     tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "numerator is " , (long)numerator ,     '!' ) ; 
  2077.     uexit ( 1 ) ; 
  2078.   } 
  2079.   if ( denominator <= 0 ) 
  2080.   {
  2081.     tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "denominator is " ,     (long)denominator , '!' ) ; 
  2082.     uexit ( 1 ) ; 
  2083.   } 
  2084.   conv = ( numerator / ((double) 254000.0 ) ) * ( resolution / ((double) 
  2085.   denominator ) ) ; 
  2086.   mag = signedquad () ; 
  2087.   if ( newmag > 0 ) 
  2088.   mag = newmag ; 
  2089.   else if ( mag <= 0 ) 
  2090.   {
  2091.     tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "magnification is " , (long)mag ,     '!' ) ; 
  2092.     uexit ( 1 ) ; 
  2093.   } 
  2094.   trueconv = conv ; 
  2095.   conv = trueconv * ( mag / ((double) 1000.0 ) ) ; 
  2096.   p = getbyte () ; 
  2097. #ifndef ARM
  2098.   if ( outmode == 3 ) 
  2099.   {
  2100.     n = dvilength () ;
  2101.     if ( n < 53 ) 
  2102.     {
  2103.       (void) fprintf( stderr ,
  2104.          "%c%s%s%ld%s%c",  ' ' ,
  2105.           "Bad DVI file: " , "only " , (long)n , " bytes long"       , '!' ) ; 
  2106.       uexit ( 1 ) ; 
  2107.     } 
  2108.     m = n - 4 ; 
  2109.     do {
  2110.         if ( m == 0 ) 
  2111.       {
  2112.         (void) fprintf( stderr ,
  2113.            "%c%s%s%c",  ' ' , "Bad DVI file: " , "all 223s" , '!' ) ; 
  2114.         uexit ( 1 ) ; 
  2115.       } 
  2116.       movetobyte ( m ) ; 
  2117.       k = getbyte () ; 
  2118.       m = m - 1 ; 
  2119.     } while ( ! ( k != 223 ) ) ; 
  2120.     if ( k != 2 ) 
  2121.     {
  2122.       tfatal ("%c%s%s%ld%c",  ' ' , "Bad DVI file: " , "ID byte is " , (long)k , '!' ) ; 
  2123.       uexit ( 1 ) ; 
  2124.     } 
  2125.     movetobyte ( m - 3 ) ; 
  2126.     q = signedquad () ; 
  2127.     if ( ( q < 0 ) || ( q > m - 33 ) ) 
  2128.     {
  2129.       tfatal ("%c%s%s%ld%s%ld%c",  ' ' , "Bad DVI file: " , "post pointer " , (long)q ,       " at byte " , (long)m - 3 , '!' ) ; 
  2130.       uexit ( 1 ) ; 
  2131.     } 
  2132.     movetobyte ( q ) ; 
  2133.     k = getbyte () ; 
  2134.     if ( k != 248 ) 
  2135.     {
  2136.       tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "byte " , (long)q , " is not post"       , '!' ) ; 
  2137.       uexit ( 1 ) ; 
  2138.     } 
  2139.     postloc = q ; 
  2140.     firstbackpointer = signedquad () ; 
  2141.     inpostamble = true ; 
  2142.     readpostamble () ; 
  2143.  
  2144.  
  2145.     inpostamble = false ; 
  2146.     q = postloc ; 
  2147.     p = firstbackpointer ; 
  2148.     startloc = -1 ; 
  2149.     if ( p < 0 ) 
  2150.     inpostamble = true ; 
  2151.     else {
  2152.         
  2153.       do {
  2154.           if ( p > q - 46 ) 
  2155.         {
  2156.           tfatal ("%c%s%s%ld%s%ld%c",  ' ' , "Bad DVI file: " , "page link " , (long)p ,           " after byte " , (long)q , '!' ) ; 
  2157.           uexit ( 1 ) ; 
  2158.         } 
  2159.         q = p ; 
  2160.         movetobyte ( q ) ; 
  2161.         k = getbyte () ; 
  2162.         if ( k == 139 ) 
  2163.         pagecount = pagecount + 1 ; 
  2164.         else {
  2165.             
  2166.           tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "byte " , (long)q ,           " is not bop" , '!' ) ; 
  2167.           uexit ( 1 ) ; 
  2168.         } 
  2169.         {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) 
  2170.         do 
  2171.           count [ k ] = signedquad () ; 
  2172.         while ( k++ < for_end ) ; } 
  2173.         if ( startmatch () ) 
  2174.         startloc = q ; 
  2175.         p = signedquad () ; 
  2176.       } while ( ! ( p < 0 ) ) ; 
  2177.       if ( startloc < 0 ) 
  2178.       {
  2179.         tfatal ("%c%s",  ' ' , "starting page number could not be found!" ) 
  2180.         ; 
  2181.         uexit ( 1 ) ; 
  2182.       } 
  2183.       movetobyte ( startloc + 1 ) ; 
  2184.       oldbackpointer = startloc ; 
  2185.       {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) do 
  2186.         count [ k ] = signedquad () ; 
  2187.       while ( k++ < for_end ) ; } 
  2188.       p = signedquad () ; 
  2189.       started = true ; 
  2190.     } 
  2191.     if ( pagecount != totalpages ) 
  2192.     tfatal ("%s%ld%s%ld%c\n",  "there are really " , (long)pagecount , " pages, not " ,     (long)totalpages , '!' ) ; 
  2193.   } 
  2194.   else
  2195. #endif
  2196.     skippages () ; 
  2197.   if ( ! inpostamble ) 
  2198.   {
  2199.     while ( maxpages > 0 ) {
  2200.         
  2201.       maxpages = maxpages - 1 ; 
  2202.       {register integer for_end; k = 0 ; for_end = startvals ;
  2203.       while ( k++ < for_end ) ; } 
  2204.       if ( ! dopage () ) 
  2205.       {
  2206.         tfatal ("%c%s%s%c",  ' ' , "Bad DVI file: " , "page ended unexpectedly"         , '!' ) ; 
  2207.         uexit ( 1 ) ; 
  2208.       } 
  2209.       do {
  2210.           k = getbyte () ; 
  2211.         if ( ( k >= 243 ) && ( k < 247 ) ) 
  2212.         {
  2213.           p = firstpar ( k ) ; 
  2214.           definefont ( p ) ; 
  2215.           k = 138 ; 
  2216.         } 
  2217.       } while ( ! ( k != 138 ) ) ; 
  2218.       if ( k == 248 ) 
  2219.       {
  2220.         inpostamble = true ; 
  2221.         goto lab30 ; 
  2222.       } 
  2223.       if ( k != 139 ) 
  2224.       {
  2225.         tfatal ("%c%s%s%ld%s%c",  ' ' , "Bad DVI file: " , "byte " , (long)curloc - 1 ,         " is not bop" , '!' ) ; 
  2226.         uexit ( 1 ) ; 
  2227.       } 
  2228.       newbackpointer = curloc - 1 ; 
  2229.       pagecount = pagecount + 1 ; 
  2230.       {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) do 
  2231.         count [ k ] = signedquad () ; 
  2232.       while ( k++ < for_end ) ; } 
  2233.       if ( signedquad () != oldbackpointer ) 
  2234.       tfatal ("%s%ld%s%ld%c\n",  "backpointer in byte " , (long)curloc - 4 , " should be "       , (long)oldbackpointer , '!' ) ; 
  2235.       oldbackpointer = newbackpointer ; 
  2236.     } 
  2237.     lab30: ; 
  2238.   } 
  2239.   if ( outmode < 3 ) 
  2240.   {
  2241.     if ( ! inpostamble ) 
  2242.     skippages () ; 
  2243.     if ( signedquad () != oldbackpointer ) 
  2244.     tfatal ("%s%ld%s%ld%c\n",  "backpointer in byte " , (long)curloc - 4 , " should be " ,     (long)oldbackpointer , '!' ) ; 
  2245.     readpostamble () ; 
  2246.   } 
  2247. }
  2248.